package exception;

public class LiLun {
    /*
        异常处理机制
            概述：
                使用返回值状态标识异常
                    使用JAVA语言出现以前，传统的异常处理方式多采用返回值来表示程序出现的异常，
                    这种方式虽然为程序员所熟悉，但却有多个坏处。
                       首先，一个API可以返回任意的返回值，而这些返回值本身并不能解释返回值是否代表一个
                    异常情况发生了和该异常的具体情况，需要调用API的程序自己判断并解释返回值的含义。
                       其次，并没有一种机制来保证异常情况一定会得到处理，调用程序可以简单的忽略该返回值，
                    需要调用API的程序员记住去检测返回值并处理异常情况。这种方式还让程序代码变的冗长，
                    尤其是当进行IO操作等容易出现异常情况的处理时，代码的很大部分用于处理异常情况的switch
                    分支，程序代码的可读性变的很差。
            异常处理机制
                当程序中抛出一个异常后，程序从程序中导致异常的代码处跳出，java虚拟机检测寻找和try关键字匹配
                的处理该异常的catch块，如果找到，将控制权交到catch块中的代码，然后继续往下执行程序，try块
                中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块，在所有的finally块代码被执
                行和当前线程的所属的ThreadGroup的uncaughtException方法被调用后，遇到异常的当前线程被终止。
      */

    /*
        异常的分类
            Throwable,Error,Exception
                Java异常结构中定义有Throwable类,Error和Exception是其派生的两个子类。其中Exception表示由
                网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常；而Error表示Java运行时环境出现的错
                误，例如：JVM内存资源耗尽等。
     */

    /*
        try-catch
            try{...}语句制定了一段代码，该段代码就是一次捕捉并处理例外的范围。
            在执行过程中，该段代码可能会产生并抛出一种或几种类型的异常对象，
            它后面的catch语句分别对这些异常做相应的处理。
            如果没有异常产生，所有的catch代码段都被略过不执行
            在catch语句块中是对异常进行处理的代码
            在catch中声明的异常对象（catch(SomeException e)）封装了异常事件发生的信息，
            在catch语句块中可以使用这个对象的一些方法获取这些信息。

        多个catch
            try{...}语句指定了一段代码，该段代码就是一次捕捉并处理例外的范围。
            在执行过程中，该段代码可能会产生并抛出一种或几种类型的异常对象，
            它后面的catch语句分别对这些异常做相应的处理。
            如果没有异常产生，所有的catch代码段都被略过不执行。
            在catch语句块中是对异常进行处理的代码。
            在catch中声明的异常对象（catch(SomeException e)）封装了一场事件
            发生的信息，在catch语句块中可以使用这个对象的一些方法获取这些信息。
     */

    /*
        finally
            finally块
                finally语句为异常处理提供一个统一的出口，使得在控制流程转到程序其它部分以前，
                能够对程序的状态作统一管理。
                无论try所指定的程序块中是否抛出异常，finally所指定的代码都要被执行。
                通常在finally语句中可以进行资源的释放工作，如果关闭打开的文件、删除临时文件等。
     */

    /*
        自动关闭特性
            JDK7之后，java推出了自动关闭特性
            旨在更优雅的在异常处理机制中关闭如流这样的操作
     */

    /*
        异常的抛出
            throw关键字
                当程序发生错误而无法处理的时候，会抛出对应的异常对象，除此之外，在某些时刻，您可能会想要自行抛出异常，
                例如在异常处理结束后，再将异常抛出，让下一层异常处理块来捕捉，若想要自行抛出异常，您可以使用“throw”
                关键词，并生成指定的异常对象后抛出
                例如：
                    throw new ArithmeticException();
                程序中会声明许多方法（Method），这些方法中可能会因某些错误而引发异常，但您不希望直接在这个方法中处
                理这些错误，而希望在调用它的方法来统一处理，这时候您可以使用“throws”关键词来声明这个方法将会抛出异
                常。
                例如：
                    public void static void stringToDate(String str) throws ParseException{...}
            重写方法时的throws
                如果使用继承时，在父类别的某个方法上宣告了throw某些异常，而子类别种重新定义该方法，您可以：
                    不处理异常（重新定义时不设定throw）。
                    可仅throw父类别中声明的部分异常。
                    可throw父类方法中抛出异常的子类异常。
                但是不可以：
                    throw出额外的异常
                    throw父类方法中抛出异常的父类异常
     */

    /*
        Java异常API
            检查异常与非检查异常
                Java异常可以分为可检测异常，非检测异常：
                    可检测异常：
                        可检测异常经编译器验证，对于声明抛出异常的任何方法，编译器将强制执行处理或声明规则，不捕捉这个异常，
                        编译器就通不过，不允许编译。
                    非检测异常：
                        非检测异常不遵循处理或者声明规则。在产生此类异常时，不一定非要采取任何适当操作，编译器不会检查是否
                        已经解决了这样一个异常。
                RuntimeException类属于非检测异常，因为普通JVM操作引起的运行时异常随时可能发生，此类异常一般是由特定操作
                引发的。但这些操作在java应用程序中会频繁出现。因此它们不受编译器检查与先处理或声明规则的限制。

            常见RuntimeException
                IllegalArgumentException：
                    抛出的异常表明向方法传递了一个不合法或不正确的参数。
                NullPointerException：
                    当应用程序试图在需要对象的地方使用null时，抛出该异常。
                ArrayIndexOutOfBoundsException：
                    当使用的数组下标超出数组允许范围时，抛出该异常
                ClassCastException：
                    当试图将对象强制转换为不是实例的子类时，抛出该异常。
                NumberFormatException：
                    当应用程序试图将字符串转换成一种数制类型，但该字符串不能转换为适当格式时，抛出该异常。

            printStackTrace()
                Throwable中定义了一个方法可以输出错误信息，用来跟踪异常事件发生时执行堆栈的内容。
                该方法定义为：
                    void printStackTrace()
                try{
                ...
                }catch(Exception e){
                    e.printStackTrace(); //输出执行堆栈信息
                }

            getMessage
                Throwable中定义了一个方法可以得到有关异常事件的信息。
                该方法定义为：
                    String getMessage()
                try{
                    ...
                }catch(Exception e){
                    System.out.println(e.getMessage());
                }
     */

    /*
        自定义Exception
            自定义异常的意义
                Java异常机制可以保证程序更安全和更健壮。虽然Java类库已经提供很多可以直接处理异常的类，
                但是有时候为了更加精准地捕获和处理异常以呈现更好的用户体验，需要开发者自定义异常。
                自定义异常要完成下列操作
                    类名要做到见名知意。
                    必须继承自Exception（直接或间接继承）
                    提供从超累异常定义的所有构造器
     */
}













